/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package analisisdatos;

import edu.stanford.nlp.ling.HasWord;
import edu.stanford.nlp.tagger.maxent.MaxentTagger;
import java.io.IOException;
import java.util.List;
import synesketch.emotion.Emotion;
import synesketch.emotion.EmotionalState;
import synesketch.emotion.Empathyscope;

/**
 *
 * @author Administrador
 */
public class Enriquecedor {
    /**
     * clase que puede leer una frase y diferenciar sus partes; verbos, sustantivos, articulos, etc
     */
    private  MaxentTagger tagger;
    /**
     * palabras no válidas para la ubicación
     */
    Pendejadas[] pendejadas;

    /**
     * Inicializa el enriquecedor leyendo el modelo para el analisis de las partes de una frase
     * @throws IOException
     */
    public Enriquecedor() throws IOException, ClassNotFoundException {

        // este modelo está en inglés
        tagger  = new MaxentTagger("/opt/sge62/Twitter/analizador/bidirectional-distsim-wsj-0-18.tagger");

        pendejadas = Pendejadas.values();

         
    }

    /**
     * revisa la ubicación del usuario y le pone un nombre estandar
     * @param usuario
     */
    public void enriquecerUbicacionUsuario(Usuario usuario) {

        String ubicacion = usuario.getUbicacion();

        limpiarUbicacion(ubicacion);
    }

    /**
     * entriquece un tweet haciendo analisis del texto que contiene
     * @param tweetNuevo
     */
    void eriquecerTweet(Tweet tweetNuevo) throws IOException {

        String texto = tweetNuevo.getTexto();
        String sentimiento = identificarSentimiento(texto);

        tweetNuevo.setSentimiento(sentimiento);

        String sustantivosMencionados = obtenerSustantivosMencionados(texto);

        tweetNuevo.setPalabrasMencionados(sustantivosMencionados);

        boolean hablaDeGripa= buscarGripa(sustantivosMencionados, texto);

        tweetNuevo.setTieneGripa(hablaDeGripa);


    }

  

    /**
     * identifica el sentimento del tweet que llega por parámetro
     * @param comentario
     * @return
     * @throws IOException
     */
    private static String identificarSentimiento(String comentario) throws IOException {
        Empathyscope buscador = Empathyscope.getInstance();
        EmotionalState sentimiento = buscador.feel(comentario);
        Emotion emocion = sentimiento.getStrongestEmotion();
        String emo = null;
        if (emocion.getType() == Emotion.ANGER) {
            emo = "Angry";
        } else if (emocion.getType() == Emotion.DISGUST) {
            emo = "Disgust";
        } else if (emocion.getType() == Emotion.FEAR) {
            emo = "Fear";
        } else if (emocion.getType() == Emotion.HAPPINESS) {
            emo = "Happy";
        } else if (emocion.getType() == Emotion.NEUTRAL) {
            emo = "Neutral";
        } else if (emocion.getType() == Emotion.SADNESS) {
            emo = "Sad";
        } else {
            emo = "Surprise";
        }
        return emo;

    }
    /**
     * obtiene los susutantivos que mencionan en un texto
     * @param texto
     * @return
     */
    private String obtenerSustantivosMencionados(String texto) {
         String resp="";

        String tags = tagger.tagString(texto);

         String[] partes = tags.split(" ");

         for (int i = 0; i < partes.length; i++) {
            String parte = partes[i];

            String[] elementos =parte.split("/");
            if (elementos[1].contains("NN")){

                             
                    resp+=elementos[0]+",";
              
            }


        }

        resp = resp.substring(0, resp.length()-1);
         return resp;
    }

    /**
     *  limpia la ubicacion si alguien no pone algo coherenta
     * @param ubicacion
     */
     private void limpiarUbicacion(String ubicacion) {
        if (!quitarVacios(ubicacion)){
            
            boolean quitarPendejadas = quitarPendejadas(ubicacion);


        }
    }
    /**
     * busca en el
     * @param sustantivosMencionados
     * @param texto
     * @return
     */
    private boolean buscarGripa(String sustantivosMencionados, String texto) {
        String[] sustantivos = sustantivosMencionados.split(",");

        for (int i = 0; i < sustantivos.length; i++) {
            String sustantivo = sustantivos[i];

            sustantivo = sustantivo.toLowerCase();
            if(sustantivo.equalsIgnoreCase("FLU") || sustantivo.equalsIgnoreCase("#FLU") || sustantivo.equalsIgnoreCase("COLD") || sustantivo.equalsIgnoreCase("#COLD")){
                return true;
            }
        }

        if(texto.contains("#FLU")){
            return true;
        }


        return false;
    }
    /**
     * si la cadana está vacía la pone como la palabra null
     * @return true si era un vacío, si es un vacío no hay que hacerle nada mas
     */
    private boolean quitarVacios(String ubicacion) {
        if(ubicacion.trim().equals("") | ubicacion.equals(" ")){
                ubicacion="null";
                return true;
        }

        return false;


    }
    /**
     * quita la mayoría de cosas sin sentido que encuentra en laubicación
     * @param ubicacion
     */
    private boolean quitarPendejadas(String ubicacion) {

        ubicacion = ubicacion.toUpperCase();

        for (int i = 0; i < pendejadas.length; i++) {
            Object object = pendejadas[i];
            String palabra = object.toString();

            if(ubicacion.contains(palabra)){
                ubicacion = "null";
                    return true;
            }

        }
        return false;
    }




}
